[[%debug
%skeleton "lalr1.cc"
%defines
-%define variant
-%locations
+%define api.value.type variant
]m4_bpatsubst([$1], [\\n], [
])[
%code // code for the .cc file
{
+#include <cstdlib> // abort, getenv
#include <iostream>
#include <sstream>
{
static]AT_TOKEN_CTOR_IF([[
parser::symbol_type yylex ()]], [[
- parser::token_type yylex (parser::semantic_type* yylval,
- parser::location_type* yylloc)]])[;
+ parser::token_type yylex (parser::semantic_type* yylval]AT_LOCATION_IF([,
+ parser::location_type* yylloc])[)]])[;
}
// Printing a list of strings (for %printer).
{
static]AT_TOKEN_CTOR_IF([[
parser::symbol_type yylex ()]], [[
- parser::token_type yylex (parser::semantic_type* yylval,
- parser::location_type* yylloc)]])[
- {
- typedef parser::location_type location;
+ parser::token_type yylex (parser::semantic_type* yylval]AT_LOCATION_IF([,
+ parser::location_type* yylloc])[)]])[
+ {]AT_LOCATION_IF([
+ typedef parser::location_type location;])[
static int stage = -1;
++stage;
if (stage == STAGE_MAX)
{]AT_TOKEN_CTOR_IF([[
- return parser::make_END_OF_FILE (location ());]], [[
- *yylloc = location ();
+ return parser::make_END_OF_FILE (]AT_LOCATION_IF([location ()])[);]],
+[AT_LOCATION_IF([
+ *yylloc = location ();])[
return parser::token::END_OF_FILE;]])[
}
else if (stage % 2)
{]AT_TOKEN_CTOR_IF([[
- return parser::make_NUMBER (stage, location ());]], [[
- yylval->BUILD (int, stage);
- *yylloc = location ();
+ return parser::make_NUMBER (stage]AT_LOCATION_IF([, location ()])[);]],
+[[
+ yylval->BUILD (int, stage);]AT_LOCATION_IF([
+ *yylloc = location ();])[
return parser::token::NUMBER;]])[
}
else
{]AT_TOKEN_CTOR_IF([[
- return parser::make_TEXT (string_cast (stage), location ());]], [[
- yylval->BUILD (std::string, string_cast (stage));
- *yylloc = location ();
+ return parser::make_TEXT (string_cast (stage)]AT_LOCATION_IF([, location ()])[);]], [[
+ yylval->BUILD (std::string, string_cast (stage));]AT_LOCATION_IF([
+ *yylloc = location ();])[
return parser::token::TEXT;]])[
}
abort ();
}
-
- void
- parser::error (const parser::location_type&, const std::string& message)
- {
- std::cerr << message << std::endl;
- }
}
+]AT_YYERROR_DEFINE[
+
int
main ()
{
]])
AT_BISON_CHECK([-o list.cc list.yy])
-AT_COMPILE_CXX([list])
-AT_CHECK([./list], 0,
- [(0, 1, 2, 4)
+AT_COMPILE_CXX([list], [$NO_STRICT_ALIAS_CXXFLAGS list.cc])
+AT_PARSER_CHECK([./list], 0,
+[(0, 1, 2, 4)
])
AT_BISON_OPTION_POPDEFS
AT_TEST([])
AT_TEST([%define parse.assert])
+AT_TEST([%locations %define parse.assert])
AT_TEST([[%define parse.assert %code {\n#define TWO_STAGE_BUILD\n}]])
AT_TEST([[%define parse.assert %define api.token.constructor]])
AT_TEST([[%define parse.assert %define api.token.constructor %define api.token.prefix "TOK_"]])
+AT_TEST([[%locations %define parse.assert %define api.token.constructor %define api.token.prefix "TOK_"]])
m4_popdef([AT_TEST])
}
%defines
-%define variant
+%define api.value.type variant
%define parse.error verbose
%define parse.trace
%%
input = argv[1];
break;
case 3:
- assert (!strcmp (argv[1], "--debug"));
+ assert (std::string(argv[1]) == "--debug");
debug = 1;
input = argv[2];
break;
AT_PARSER_CHECK([[./input aaaap]])
AT_PARSER_CHECK([[./input --debug aaaap]], [[2]], [[]], [[stderr]])
-AT_PARSER_CHECK([[grep '^exception caught: printer$' stderr]], [], [ignore])
+AT_CHECK([[grep '^exception caught: printer$' stderr]], [], [ignore])
AT_PARSER_CHECK([[./input aaaae]], [[2]], [[]],
[[exception caught: syntax error
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+
+## ------------------------------------ ##
+## C++ GLR parser identifier shadowing ##
+## ------------------------------------ ##
+
+AT_SETUP([[C++ GLR parser identifier shadowing]])
+
+AT_DATA_GRAMMAR([input.yy], [
+%skeleton "glr.cc"
+
+%union
+{
+ int ival;
+}
+
+%token <ival> ZERO;
+
+%code
+{
+ int yylex (yy::parser::semantic_type *yylval);
+}
+
+%%
+exp: ZERO
+
+%%
+
+int yylex (yy::parser::semantic_type *yylval)
+{
+ return yy::parser::token::ZERO;
+}
+
+void yy::parser::error (std::string const& msg)
+{}
+
+int main()
+{}
+])
+
+AT_BISON_CHECK([[-o input.cc input.yy]])
+AT_COMPILE_CXX([[input]])
+
+AT_CLEANUP